Re: 僕らを縛る Node.js という呪いについて
「久しぶりに Rails を書いたけれど、Node.js の良さに敵わない」と。
その言葉に同意しながらも、他方で少し不思議に思う。
デスクトップアプリ。これはもはやOSの機能にアクセスしない限りは Web アプリとして作る選択肢が多いように思う。
代わりに React Native のような中間択はグラデーション広く利用されており、特に少ないリソースで多くのプラットフォームに対して価値提供すべきスタートアップの事業者は利用している。
ソフトウェアエンジニアが携わるほぼ全ての領域に、Node.js を使う余地があり、また時には利用する合理性すら生まれる。
要約
「現代のソフトウェア開発では、不思議なほどに Node.js で何も出来てしまう。これは合理的な説明のつく事なのだろうか? 結果として他の言語に踏み出すのがとても面倒であり、JavaScript しか書けない呪いをかけられたようだ。」
---
JavaScript が他の言語より、特に他の動的言語よりもよく使われるようになった理由はいくつか考えられると思う。
ブラウザの唯一のデフォルト言語である事
V8 の誕生
npm の誕生
ES6 の覚醒
TypeScript の成功
ブラウザの言語である事
全てのブラウザにデフォルトで載っているプログラミング言語は JavaScript であって、それ以外の言語は載っていない。
ただし昔はそうではなかった。Flash が流行っていた時代はどのブラウザでも ActionScript が動いていた。
Flash 対抗の Microsoft 製品であった Silverlight では C# や .NET 言語が動いていた。
古くは Java Applet で Java も動いていたし、IE がブラウザシェアを取っていた時代は ActiveX アプリを VB Script で書くのも当たり前だった
2010年ごろ Flash が "インタラクティブなWeb" のほとんどのシェアを取っていた。ブラウザは簡単なページを HTML, CSS, JavaScript で表示して、複雑なページは Flash Player で表示するソフトウェアになりつつあった。
Flash があまりにも支配的なため、ブラウザをスキップして、いきなり Flash のページを表示する技術 Adobe Air とかその SDK の Adobe Flex みたいな技術も流行し始めていた。Adobe が Web の UI 全体を乗っとるぐらいの勢いがあった。
しかし Flash は Adobe のプロプライエタリなソフトウェアで、このまま Flash が伸びてしまっては、Adobe の一人勝ちである。このままでは Web 全体が Adobe にロックインされた世界になってしまう。それはブラウザベンダとしては非常に面白くない。
そこで当時主なブラウザベンダであった Microsoft、Apple、Google、Mozilla (全てのブラウザベンダ) が一致団結して、これからの Web は HTML5 だ、というキャンペーンを始めた。
当時の JavaScript は ActionScript に比べたら相当遅れている言語だったし (ActionScript には既に class も型もあった)、Flash Player のランタイムに比べたら、HTML5 (とか CSS3 等) が提供する API はとても貧弱なものだったため、当初はなかなか厳しい戦いだったような印象がある。しかし、全てのブラウザベンダが協力体制を組んでいるため、HTML5 の API はどんどん拡充されていって、次第にこの動きは大成功した。
約10年後の 2020年12月31日 Flash Player のサポートが終了した。
結果として JavaScript はブラウザで動く唯一の言語になった。おそらくこれからもこの状況は変わらない。ブラウザのデフォルト言語はきっと永久に JavaScript であり続けるだろう。このアドバンテージはかなり大きい。
V8 の誕生
Java のデファクトの VM である HotSpot を作った Lars Bak という人がいる。
Lars Bak は 2004年に Google に入って V8 という JavaScript のエンジンを作った。このエンジンが今でも Google Chrome の中で動いているし、Node.js の中でも V8 エンジンが動いている。
V8 は JIT optimization という機能を持っており、JavaScript の実行が始まってから、コードを極端に最適化する。この最適化の結果、動的言語としてはあり得ないレベルでコードの実行が速くなる。
2020年に Fabrice Bellard という人が QuickJS という非常に軽量な JavaScript 実装を作った (ES2020 互換)。そのベンチマークページ で、その他の実装と QuickJS の速度比較をしている。あまり有名でない実装と比べると QuickJS はかなり良い数値を出している。最近 Facebook が作った Hermes という React Native 用の JS engine と比べても遜色無い数値を出している。その表の一番端に V8 (JIT) というカラムがあるが、ほとんどのベンチマークで QuickJS の 30倍ちかい数値が出ている。V8 は普通に言語を実装しただけでは絶対に出ないようなスピードが出る。 結果として、V8 を載せている Node.js は Ruby や Python よりも圧倒的に速い。動的言語の中で Node.js に近いスピードが出せる言語が他に無いという圧倒的なアドバンテージがある。
npm の誕生
Node.js のパッケージマネージャーで npm というツールがある。
npm は元々は Node Package Manager の略で、Node.js のためのパッケージマネージャだった。実際 npm からコードを install すると、Node.js で利用できるような形でカレントディレクトリにスクリプトがインストールされる。
ある時に substack という人が browserify というツールを作った。このツールは Node.js で利用出来るようにインストールされているコードを全部繋げて一個の大きいスクリプトにまとめるというツールだった。このツールの存在によって、npm に上がってるモジュールを browserify で一個に繋げてブラウザ上で使える形にするというスタイルのフロントエンド開発が始まった。(browserify 自体は現在は廃れて、webpack、rollup、esbuild といった代替ツールが主流になっているが、元々のコンセプトは変わっていない)
browserify は名前の通り、ブラウザで使えるようにするという趣旨のツールだったけれど、これをベースに electron 環境向けのスクリプトも作れれば、AWS Lambda 環境向けのスクリプトも作れれば、React Native (モバイル) 向けのスクリプトも作れる、というように JavaScript が動くあらゆる環境向けのスクリプトに npm のパッケージを使うことが出来るようになった。
結果的に npm にはあらゆる環境向けのパッケージが共存するようになる。
npm には現在あらゆる言語のパッケージレジストリの中で最も多くのパッケージが登録されている。
ES6 の覚醒
HTML5 というバズワードが流行り始めた頃、Flasher だった人たちはきっと冷ややかな目で見ていたと思う。とにかく JavaScript は言語としての質が低かった。型の扱いが雑、class が無い、普通に for 文を書くことも出来ない、やってはいけないアンチパターンな言語機能が大量にある。2010年ごろに普通に使われているプログラミング言語の中では JavaScript は圧倒的にデザインが悪かった。
JavaScript は人間が直接書く言語では無いと誰もが信じていたため、大量の AltJS 言語 (別のベターな言語から JavaScript にコンパイルする言語) が大流行していた。AltJS の中では CoffeeScript が頭ひとつ抜けていた感はあるもの他にも Haxe、Dart、LiveScript、PureScript、etc などいろいろな言語が乱立して覇権を争っていた。
2015年に大きな変化が起きた。ES6 という JavaScript の新しいバージョンが策定された。これは特定のベンダーが勝手に定義したものではなく、標準化団体から出てきたものだった。
ES6 には class があったし、module 機能があった。Promise のような非同期プログラミングを抽象化するクラスなども含まれていた。ES6 が出たことで JavaScript は突然「まともな」言語になった。
その後も JavaScript は毎年改訂版が出されるようになり、async-await、ジェネレータ、async iterator、BigInt、Symbol、(上げだすとキリがない)、モダンでよく考えられた新機能がどんどんリリースされるようになった。
今の JavaScript を見ると、言語としても他の言語と遜色無いレベルに達しているし、一面では他の言語の先を行っていると言えるような面もある (非同期関連など)。
JavaScript の弱点だった 言語してのデザインの悪さはいつの間にかどこかに行ってしまって、むしろ今の JavaScript は普通に「良い言語」と言えるレベルに達している。
TypeScript の成功